定期ミートアップ 第27回
Motivation
#Shiika にeffect handlerを取り入れることは可能なのか、取り入れるといいことがあるか Algebraic effects and handlers
自分の知っている範囲だと例外に一番似ている
例外と違うのは、ハンドラが継続を受け取ること
code:txt
def foo begin
... foo
raise Exception rescue Exception => e
... p e
end end
code:txt
def foo handle {
... foo
perform Effect::DeleteFile(path) }.with {|e|
match e
when Effect::DeleteFile(path, k)
... # ファイル削除処理
k()
end
end }
when Effect::DeleteFile(path, k)
File.AsyncDelete(path).then(k)
すげー強力
つまり
継続を呼ばなければ、例外(大域脱出)になる
継続を最後に一度だけ呼んだ場合は、普通のDependency Injectionぽい感じ
継続をコールバックとして渡すと、非同期計算
継続を呼んだあとに副作用を起こすと、トリッキーな挙動が
継続を2回以上呼ぶと、非決定計算とかバックトラックができる
Schemeみたいな方向性の言語ならいいのでは
Effect system
関数がどのようなエフェクトを起こすかを型情報に入れる
エフェクトがハンドルされることを静的検査できる
effect handlerを実装するライブラリ
継続を取る機能がなかったりする
Unisonさわってみた
これIOをモックできなくね??
ボツスライド
モナドとの比較
複数種類の副作用を同時に使うときに楽らしい
code:txt
do 処理1(function(){
処理1 処理2(function(){
処理2 処理3(function(){
処理3